class PriorityPromiseQueue {
    constructor() {
        // 需要将所有包括promise的函数保存下来的队列
        // 毕竟不能立刻执行，否则全送去事件循环后，就无法实现有序执行了
        this.queue = []
        this.results = []   // all results时打印的结果
        this.isPaused = false
        this.isRunning = false
    }
    add(promiseFunc, priority) {
        // 为了完成有顺序的运行，这里的promise不能立刻执行
        // 否则一旦微任务进入事件循环，就会立刻执行
        // 所以这里只能将传参的promise函数和优先级存入队列
        this.queue.push({promiseFunc, priority})
        this.queue.sort((a, b) => b.priority - a.priority)
    }
    pause() {
        this.isPaused = true
    }
    // 因为需要做到动态暂停，所以这里必须要使用async/await
    // 一旦发现isPaused为true，就会暂停
    async start() {
        this.isPaused = false
        if(this.isRunning)
            return

        // 只能在isRunning 范围内运行
        this.isRunning = true
            // 开始运行
            while(this.queue.length && !this.isPaused) {
                let {promiseFunc} = this.queue.shift()
                let result = await promiseFunc()
                this.results.push(result)
            }
        this.isRunning = false

        return this.results
    }
    async resume() {
        // 只有暂停时才能恢复
        if(this.isPaused) {
            // 关闭暂停
            this.isPaused = false
            return await this.start()
        }
    }
    // 立刻获取所有结果
    async getAllResults() {
        return this.results
    }
}
const queue = new PriorityPromiseQueue()
queue.add(() => new Promise((resolve) => {
    setTimeout(() => {
        resolve("Low")
    }, 100)
}), 1)
queue.add(() => Promise.resolve("High"), 3)
queue.add(() => new Promise((resolve) => {
    setTimeout(() => {
        resolve("Medium")
    }, 50)
}), 2)

setTimeout(() => {
    queue.pause()
}, 10)
queue.start().then((results) => {
    console.log("Start results: ", results)
    console.log("之后的代码Paused中")
})
setTimeout(() => {
    queue.resume().then((results) => {
        console.log("Resume results: ", results)
        console.log("All results: ", queue.getAllResults())
    })
}, 200)